/**
 * rest 剩余参数(数组) 代替arguments(伪数组)
 * rest 参数之后不能再有其他参数（即只能是最后一个参数），否则会报错
 */

// 利用 rest 参数可以向该函数传入任意数目的参数
function add(...values) {
  let sum = 0
  for (let val of values) {
    sum += val
  }
  return sum
}

console.log(add(1, 2)) // 3
console.log(add(1, 2, 3, 4))  // 10

// 简化 =>箭头函数
const addEasy = (...values) => {
}

function push(array, ...items) {
  items.forEach((item) => {
    array.push(item)
  })
}

let arr = []
push(arr, 1, 2, 3, 4, 5)
console.log(arr) // [ 1, 2, 3, 4, 5 ]

// name 可以返回函数名
const fn1 = function fn_add() {
  return 'fn_add'
}
console.log(fn1.name) //fn_add

/**
 * 尾调用：尾调用（ Ta all ）是函数式编程 个重要概念，本身非常简单，一句话就能说清楚
 * 是指某个函数的最后一步是调用另一个函数。
 * 尾递归：使用函数来实现循环
 */
function tailFab(n, total) {
  if (n === 1) return total;
  return tailFab(n - 1, n * total)
}

function fab(n) {
  return tailFab(n, 1)
}

console.log(fab(5))  // 120



